<%--
    Document   : image
    Created on : 2011-2-20, 15:16:07
    Author     : black
--%>

<%@page import="java.awt.Font"%>
<%@page import="javax.imageio.ImageIO"%>
<%@page import="java.awt.Graphics"%>
<%@page import="java.awt.image.BufferedImage"%>
<%@page import="java.util.Random"%>
<%@page import="java.awt.Color"%>
<%@page import="java.io.*"%>
<%@page contentType="image/jpeg" pageEncoding="UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">



<%!
    Color getRandColor(int fc, int bc) {//在确定的范围中获得随机颜色
        Random random = new Random();
        if (fc > 255) {
            fc = 255;
        }
        if (bc > 255) {
            bc = 255;
        }
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }
%>
<%
//设置页面不缓存
            response.setHeader("Pragma", "No-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
// 在内存中创建图象
            int width = 75, height = 24;
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
            Graphics g = image.getGraphics();
//生成随机类
            Random random = new Random();
// 设定背景色
            g.setColor(getRandColor(200, 250));
            g.fillRect(0, 0, width, height);
//设定字体
            g.setFont(new Font("Times New Roman", Font.PLAIN, 24));
// 随机产生155条干扰线，使图象中的认证码不易被其它程序探测到
            g.setColor(getRandColor(160, 200));
            for (int i = 0; i < 50; i++) {
                int x = random.nextInt(width);
                int y = random.nextInt(height);
                int xl = random.nextInt(width);
                int yl = random.nextInt(height);
                g.drawLine(x, y, x + xl, y + yl);
            }
// 取随机产生的认证码(4位数字)
            String sRand = "";
            for (int i = 0; i < 4; i++) {
                String rand = String.valueOf(random.nextInt(10));
                sRand += rand;
                // 将认证码显示到图象中
                g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));//调用函数出来的颜色相同，可能是因为种子太接近，所以只能直接生成
                g.drawString(rand, 17 * i + 6, 20);
            }
// 将认证码存入SESSION
            session.setAttribute("code", sRand);
// 图象生效
            g.dispose();
// 输出图象到页面
            try {
                //ImageIO.write(image, "JPEG", response.getOutputStream());
                ImageIO.write(image, "JPEG", response.getOutputStream());
                out.clear();
                out = pageContext.pushBody();
            } catch (Exception ex) {
            } finally {
                try {
                    //response.getOutputStream().close();
                } catch (Exception ex) {
                }
            }
%>
